
import { getLocation } from './uniapp/common';
import { getBeiJinTimeFromNet, getLocalSolarTime8H, formatDate, getLocalZone } from './date';

/**
 * 内置一套时间系统，不依赖于用户的手机时间。
 * 郫县的坐标： 30.74166667, 103.92944444 
 */
export const baseData = {
    longitude: 103.92944444, // 经度。浮点数，范围为-180~180，负数表示西经。 1001表示未初始化
    latitude: 30.74166667, // 纬度。 浮点数，范围为-90~90，负数表示南纬。 1001表示未初始化
    __lastUpdatePosTime: Date.now(),
    beijin: new Date(), // 当前的北京时间。
    local: new Date(), // 当前的当地时间。
    __lastUpdateNetTime: Date.now(),
}

/**
 * 获取本地时间，带有时区信息。
 * @returns   格式为： YYYY-MM-DD HH:FF:SS.SSS +04.78
 */
export function getLocalTimeWithZone() {
    const zone = getLocalZone(baseData.longitude);
    return formatDate(baseData.local) + (zone ? ' ' + zone : '');
}

function startTime() {
    increaseSecond();
    setInterval(() => {
        increaseSecond();
    }, 1000);
}

function increaseSecond() {
    baseData.beijin.setSeconds(baseData.beijin.getSeconds() + 1);
    baseData.local.setSeconds(baseData.local.getSeconds() + 1);
}

const sexHour = 6 * 60 * 60 * 1000; // 6小时

// 启动定时器，让时间动起来。
startTime();

export function updateLocationOnce() {
    baseData.__lastUpdatePosTime = Date.now();
    return getLocation().then((res: any) => {
        baseData.longitude = res.longitude;
        baseData.latitude = res.latitude;
        updateLocalByBeiJinDate(baseData.beijin);
        return res;
    });
}


let locationTimer = -1;
function updateLocationInterval(nextSpaceTime = sexHour) {
    if (locationTimer !== -1) {
        clearTimeout(locationTimer);
    }
    locationTimer = setTimeout(() => {
        const now = Date.now();
        if (now - baseData.__lastUpdatePosTime < sexHour) {
            const dis = sexHour - (now - baseData.__lastUpdatePosTime);
            if (dis > 30000) { // 误差大于30s时，应该等待 
                locationTimer = -1;
                updateLocationInterval(dis);
                return;
            }
        }
        baseData.__lastUpdatePosTime = now;
        getLocation().then((res: any) => {
            baseData.longitude = res.longitude;
            baseData.latitude = res.latitude;
            updateLocalByBeiJinDate(baseData.beijin);
        }).finally(() => {
            locationTimer = -1;
            updateLocationInterval();
        });
    }, nextSpaceTime); // 最长间隔6小时更新一次时间和位置
}

export function updateNetTimeOnce() {
    baseData.__lastUpdateNetTime = Date.now();
    return getBeiJinTimeFromNet().then(date => {
        console.log(`once获取的网络时间：${date ? formatDate(date) : null}`);
        if (date === null) {
            return null;
        }
        baseData.beijin = date;
        updateLocalByBeiJinDate(date);
        return date;
    });
}

let netTimeTimer = -1;
function updateNetTimeInterval(nextSpaceTime = sexHour) {
    if (netTimeTimer !== -1) {
        clearTimeout(netTimeTimer);
    }
    netTimeTimer = setTimeout(() => {
        const now = Date.now();
        if (now - baseData.__lastUpdateNetTime < sexHour) {
            const dis = sexHour - (now - baseData.__lastUpdateNetTime);
            if (dis > 30000) { // 误差大于30s时，应该等待
                netTimeTimer = -1;
                updateNetTimeInterval(dis);
                return;
            }
        }
        baseData.__lastUpdateNetTime = now;
        getBeiJinTimeFromNet().then(date => {
            console.log(`interval获取的网络时间：${date ? formatDate(date) : null}`);
            if (date === null) {
                return;
            }
            baseData.beijin = date;
            updateLocalByBeiJinDate(date);
        }).finally(() => {
            netTimeTimer = -1;
            updateNetTimeInterval();
        });

    }, nextSpaceTime); // 最长间隔6小时更新一次时间和位置
}



function updateLocalByBeiJinDate(beijinDate: Date) {
    if (baseData.longitude !== 1001) {
        baseData.local = getLocalSolarTime8H(baseData.longitude, beijinDate);
    }
}

export function initBaseData() {
    updateLocationOnce();
    updateLocationInterval();
    updateNetTimeOnce();
    updateNetTimeInterval();
}

